انتقل إلى المحتوى الرئيسي

الطاولات

صورة صفحة الطاولات

صفحة الطاولات حطيتها ثاني شي لان لازم علمود تحط طاول بقاعة لازم عندك ...قاعة , فلهذا علمود تسوي طاول لازم عندك قاعة اول شي


فايلات الفولدر

// Tables Folder
TablesRequest.ts;
useTables.ts;
TablesView.tsx;

TablesRequest.ts

import * as z from "zod";

export const schema = z.object({
tableNumber: z
.number({ required_error: "يجب ادخال رقم" })
.min(0, { message: "يجب ان يكون رقم الطاولة صفر او اكثر" }),
capacity: z
.number({ required_error: "يجب ادخال رقم" })
.min(1, { message: "يجب ان تكون سعة الطاولة اكبر من صفر" }),
});

export type TablesRequestType = z.infer<typeof schema>;
  • السكيما مال الفورمة مال اضافة طاولة جديدة وعدد المقاعد

useTables.ts

//------------------Delete Table--------------------//
const useDeleteTable = useMutation({
mutationFn: deleteTable,
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ["tables"],
refetchType: "active",
});
queryClient.invalidateQueries({
queryKey: ["halls"],
refetchType: "active",
});
setSelectedTable(null);
setOpenDeleteDialog(false);
},
onError: (error: any) => {
setRequestError(error || "حدث خطأ في حدث الطاولة");
console.error("edit tables error :", error);
},
});
//--------------------------------------//
const handleOpenDelete = (tableId: number) => {
if (tablesData) {
const table = tablesData.find((table) => table.id === tableId);
if (table) {
setSelectedTable(table.id);
setOpenDeleteDialog(true);
}
}
};
//--------------------------------------//
const handleTableDelete = () => {
if (selectedTable && selectedHall) {
useDeleteTable.mutate({
tableId: selectedTable,
hallId: selectedHall,
});
}
};
  • useDeleteTable : هاي الدالة راح تنفذ عملية الحذف وراح تستخدم ال deleteTable Function
  • محتاج علمود تشتغل الدالة شغلتين tableId , hallId والي راح يتم فحصهن بدالة ال handleTableDelete اذا اكو قيمة راح يفعل عملية الحذف واذا لا مراح يتفعل
  • handleOpenDelete : هاي راح تشغل ال Dialog مال الحذف علمود تأكد على عملية الحذف بس تجيك اذا اكو هيج طاولة مختارة لو لا قبل لا يفتح ال Dialog
//-------------update Table---------------//
const useEditTable = useMutation({
mutationFn: editTable,
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ["tables"],
refetchType: "active",
});
queryClient.invalidateQueries({
queryKey: ["halls"],
refetchType: "active",
});
setSelectedTable(null);
setRequestError("");
setOpenDialog(false);
},
onError: (error: any) => {
setRequestError(error || "حدث خطأ في تعديل الطاولة الطاولة");
console.error("edit tables error :", error);
},
});
//----------------------------//
const openEditTableDialog = (id: number) => {
if (tablesData) {
const table = tablesData.find((table) => table.id === id);
if (table) {
setSelectedTable(table.id);
reset({
tableNumber: table.tableNumber,
capacity: table.capacity,
});
setOpenDialog(true);
}
}
};
  • openEditTableDialog : راح تجيك اذا اكو بيانات اول شي جاية لو لا , بعدين راح يدور على ال Id الي اجاه بهاي الطاولات اذا موجودة راح يسوي تحديث ويصفر رقم الطاولة والعدد علمود التحديث الجاي
  • useEditTable : راح تتفعل لمن يسوي المستخدم تحديث وراح يعبر الها من ال onSubmit Function الطاولة المحدثة بياناتها
  • راح يسوي عملية Refetch للقاعات والطاولات لان بعد ما يفيد الكاش القديم
//-------------Add Table----------------//
const onSubmit = (data: TablesRequestType) => {
if (selectedHall) {
if (selectedTable) {
useEditTable.mutate({
...data,
restaurantHallId: selectedHall,
id: selectedTable,
});
} else {
useAddTable.mutate({ ...data, restaurantHallId: selectedHall });
}
}
};

//------------------------------//
const useAddTable = useMutation({
mutationFn: addTable,
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ["tables"],
refetchType: "active",
});
queryClient.invalidateQueries({
queryKey: ["halls"],
refetchType: "active",
});
setRequestError("");
setOpenDialog(false);
},
onError: (error: any) => {
if (axios.isAxiosError(error)) {
const errorMessage = error.response?.data?.message || "Unknown error";
console.log("errorMessage", errorMessage);
toast.error(errorMessage);
} else {
console.error("Unexpected error", error);
}
},
});
  • onSubmit : لمن المستخدم حيدوس تحديث او اضافة الدالة الحالية راح تتفعل بكل الاحوال بس راح تجيك اذا اكو قاعة وطاولة مختارة اذا راح يحدث واذا لا راح يسوي اضافة
  • useAddTable : هنا راح يستقبل من الهاندلر البيانات الي دخلها المستخدم على الطاولة الجديدة وراح يسوي عملية انشاء وراح يسوي ايضا Refetch على القاعات والطاولات لان الكاش القديم بعد ما يفيد

TablesView.tsx

type TableViewProps = {
table: TableType;
t: TFunction;
openEditTable: (id: number) => void;
openDeleteDialog?: (id: number) => void;
};
export function MonitorTable({
table,
t,
openEditTable,
openDeleteDialog,
}: TableViewProps) {
const [dir] = useLocalStorage("dir", "rtl");
return (
<div
key={table.id}
className={`rounded-2xl px-2 py-3 bg-[#F6F6F9] dark:bg-[#27252C] flex flex-col flex-wrap items-center gap-6`}
>
<div
className={`relative p-2 bg-gray-100 dark:bg-[#383540] rounded-3xl ${
table.isBusy ? "text-red-500" : "text-[#55C023]"
} text-6xl`}
>
{tableIconType4}
<span className="absolute top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] text-white text-2xl font-bold">
{table.tableNumber}
</span>
</div>
<div className="flex gap-2">
<Button
className="bg-white text-black border hover:bg-white/60"
onClick={() => openEditTable(table.id)}
>
<TbEdit /> {t("pages.tables.editTable")}
</Button>
{openDeleteDialog && (
<Button
onClick={() => openDeleteDialog(table.id)}
variant={"destructive"}
>
<Trash />
{t("pages.tables.deleteTable")}
</Button>
)}
</div>
</div>
);
}

-MonitorTable : هذا كومبوننت خاص بالتيبل علمود يعرض الطاول بالشكل الي شفتة ببداية الصفحة

  • TableViewProps : هاي انواع البيانات الي راح تعبر للفانكشن والي هنة اربعة مثل ما موضحة ووحدة من عدهن هي tFunction هاي خاصة بالترجمة علمود اللlocalization

ملاحظة : بالنسبة للDialogComponent و DeleteDialog هذني راح يتم الشرح عنهن بفولدر الملفات المشتركة لانهن مستخدمة باكثر من مكان